﻿Imports System.Xml
Imports System.Text
Imports System.IO
Imports System.Threading

Namespace Control
    ''' <summary>
    ''' Regra de negócio para NFe e integração
    ''' </summary>
    ''' <remarks></remarks>
    Public Class NFe

        ''' <summary>
        ''' Envio de NFes em Lote
        ''' </summary>
        ''' <param name="nfsPesquisa">Lista de NFs do tipo pesquisa</param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Function NFeEnvia(ByVal nfsPesquisa As IList(Of Model.NfPesquisa)) As Boolean
            Dim nfs As New List(Of Model.Nf)

            ' Cria uma lista de NF completa para geração do XML
            For Each e In nfsPesquisa
                Dim nf As Model.Nf
                Dim ControlNF As New Control.Nf

                nf = ControlNF.GetById(e.cd_nf)

                nfs.Add(nf)
            Next

            Envia(nfs)
            'GNFeTarefa()
        End Function
        ''' <summary>
        ''' Envia uma NFe e emite o DANFE
        ''' </summary>
        ''' <param name="nf"></param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Function NFeEnvia(ByVal nf As Model.Nf) As Boolean
            Dim nfs As New List(Of Model.Nf)
            nfs.Add(nf)
            Envia(nfs)
            'GNFeIntegrador()
        End Function
        Private Function Envia(ByVal nfs As IList(Of Model.Nf)) As Boolean
            ' Gera um XML para cada NFe
            For Each nf In nfs
                NFeGeraXML(nf)
            Next
            ' Serviço em segundo plano que monitora os arquivos processaos
            NFeAtualiza()
        End Function

        Public Function NFeCancela(ByVal nfs As IList(Of Model.Nf)) As Boolean

        End Function

        ' Criar uma treed para trabalhar em segundo plano que fique monitorando as nfs processados e atualize no banco de dados
        ' ai mostre no tray icon quando a nf é processado, seja efetivada, ou inutilizada...
        Public Function NFeAtualiza() As Boolean
            ' Cria processo em background
            ' Fica verifncando se as nf foi processadas
            ' Aviso via balon o resultado
        End Function


        ''' <summary>
        ''' Gera o XML de uma NFe para envio
        ''' </summary>
        ''' <returns></returns>
        ''' <remarks>Por enquanto gera no diretório de envio e no formato estabelecido pela migrate para integração
        ''' com o GNFe</remarks>
        Private Function NFeGeraXML(ByVal nf As Model.Nf) As Boolean
            'Dim doc As XmlDocument
  
            'doc
        End Function

        ''' <summary>
        ''' Gera o XML de pedido para verificar o status do serviço
        ''' </summary>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Function NFeGeraPedidoStatusServico() As Boolean

            Dim cDateTime As String
            Dim cFileCreate As String
            Dim cFileRetorno As String

            ' ex: 20100222T222310-ped-sta.xml
            ' Criar parâmetros para caminhos
            cDateTime = DateTime.Now.ToString("yyyMMddTHHmmss")
            cFileCreate = String.Format("C:\UniNFE\envio\{0}-ped-sta.xml", cDateTime)
            cFileRetorno = String.Format("C:\UniNFE\retono\{0}-sta.xml", cDateTime)

            Dim xmlStatus As New StringBuilder

            ' Criar parâmetros para as tags Ver o geraxml.cx do uninfe
            xmlStatus.Append("<?xml version=""1.0"" encoding=""UTF-8""?>")
            xmlStatus.Append("<consStatServ versao=""1.07"" xmlns=""http://www.portalfiscal.inf.br/nfe"">")
            xmlStatus.Append("<tpAmb>2</tpAmb>")
            xmlStatus.Append("<cUF>31</cUF>")
            xmlStatus.Append("<xServ>STATUS</xServ>")
            xmlStatus.Append("</consStatServ>")

            Try
                File.WriteAllText(cFileCreate, xmlStatus.ToString(), Encoding.Default)
            Catch ex As Exception
                ' Mudar para degub.write
                MessageBox.Show(ex.Message)
            End Try


            ' Por 5 segundos aguarda o aquivo de retorno ex: 20101006T172501-sta.xml
            Dim nEspera As Integer = 0
            Dim lRetorno As Boolean = True

            While Not File.Exists(cFileRetorno)
                ' Verifica/Espera a cada meio segundo
                Thread.Sleep(500)

                ' Se tentou 10x = 5 segundos sai do laço
                If nEspera > 9 Then
                    ' Saido laço
                    lRetorno = False
                    Exit While
                End If
                nEspera = nEspera + 1
            End While

            ' Abre o arquivo e mostra a mesangem de retorno
            If lRetorno Then
                '<?xml version="1.0" encoding="UTF-8"?>
                '<retConsStatServ versao="1.07" xmlns="http://www.portalfiscal.inf.br/nfe">
                '  <tpAmb>2</tpAmb>
                '  <verAplic>0662</verAplic>
                '  <cStat>107</cStat>
                '  <xMotivo>Servico em operacao</xMotivo>
                '  <cUF>31</cUF>
                '  <dhRecbto>2010-10-06T17:25:38</dhRecbto>
                '  <tMed>1</tMed>
                '</retConsStatServ>              
                Dim doc As XmlDocument = New XmlDocument()
                doc.Load(cFileRetorno)

                Dim retConsStatServ As XmlNodeList = doc.GetElementsByTagName("retConsStatServ")
                For Each retConsStatServNode As XmlNode In retConsStatServ

                    Dim retConsStatServElemento As XmlElement = DirectCast(retConsStatServNode, XmlElement)

                    Dim msg As New StringBuilder

                    msg.AppendLine("Ambiente: " + retConsStatServElemento.GetElementsByTagName("tpAmb")(0).InnerText)
                    msg.AppendLine("Status: " + retConsStatServElemento.GetElementsByTagName("cStat")(0).InnerText + " " + retConsStatServElemento.GetElementsByTagName("xMotivo")(0).InnerText)
                    msg.AppendLine("UF: " + retConsStatServElemento.GetElementsByTagName("cUF")(0).InnerText)
                    msg.AppendLine("Data da consulta: " + retConsStatServElemento.GetElementsByTagName("dhRecbto")(0).InnerText)

                    MessageBox.Show(msg.ToString())
                Next








            End If




        End Function


    End Class
End Namespace